package com.shuai.analysis.config;


import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FanoutExchangeConfig {
    // 通过Bean对象声明交换机和队列的基本步骤
    /*
     * 1. 声明交换机
     * 2. 声明队列
     * 3. 绑定交换机和队列
     * */
    @Bean
    public FanoutExchange declareFanoutExchange() {
        return ExchangeBuilder.fanoutExchange("admin.fanout").build();
    }

    @Bean
    public Queue declareFanoutQueue1() {
        return QueueBuilder.durable("fanout.queue1").lazy().build();
    }

    // 第一种绑定方式
    @Bean
    public Binding bindingFanoutQueue1ToExchange() {
        // 在进行下面的两个方法调用时，本质上并不是重新执行了一遍
        // Spring对标注了Bean对象的方法进行了动态代理，
        // 在手动进行方法调用时，会首先检查Spring中是否有方法返回的Bean对象
        // 如果有，则直接返回这个Bean对象，而不会重新调用方法执行方法逻辑返回一个新的Bean对象
        return BindingBuilder.bind(declareFanoutQueue1()).to(declareFanoutExchange());
    }

    // 第二中绑定方式，Bean对象参数注入的方式
    @Bean
    public Binding bindingFanoutQueue1ToExchange(FanoutExchange descFanoutExchange, Queue declareFanoutQueue1) {
        return BindingBuilder.bind(declareFanoutQueue1).to(descFanoutExchange);
    }
}
